package com.fwmagic.spark.streaming.util

import redis.clients.jedis.{Jedis, Pipeline}

/**
  * Redis本身对数据进行操作，是原子性的
  * 测试Redis单机版的事物【pipline】，Redis主从负责也支持pipline
  * 将Redis的多个操作放到一起执行，要成功都成功，如果失败，可以把整个操作放弃，实现事物操作
  * Redis的分片副本集集群不支持pipline
  *
  * Mongo集群支持事物，是一个NoSql文档数据库，支持存储海量数据，安全，可扩容
  */
object JedisPiplineTest {
    def main(args: Array[String]): Unit = {
        val jedis: Jedis = JedisConnectionPool.getConnection()
        jedis.select(2)
        //获取pipline
        val pipeline: Pipeline = jedis.pipelined()

        //让多个操作在一个pipline里面
        pipeline.multi()

        try {
            pipeline.hincrBy("zhangsan", "money", 100)

            //模拟异常
            //val i = 1/0

            pipeline.hincrBy("lisi", "money", 50)

            //提交事物
            pipeline.exec()
            pipeline.sync()
        } catch {
            case e:Exception => {
                //[回滚]将脏数据清除
                pipeline.discard()

                e.printStackTrace()
            }
        } finally {
            if (pipeline != null) pipeline.close()
            if (jedis != null) jedis.close()
        }
    }

}
